/*
有 N种物品和一个容量是 V的背包。第 i种物品最多有 si件，每件体积是vi，价值是 wi。
求解将哪些物品装入背包，可使物品体积总和不超过背包容量，且价值总和最大。
输出最大价值。
输入格式
第一行两个整数，N，V
，用空格隔开，分别表示物品种数和背包容积。
接下来有 N
 行，每行三个整数 vi,wi,si，用空格隔开，分别表示第i种物品的体积、价值和数量。
输出格式
输出一个整数，表示最大价值。
*/
#include<bits/stdc++.h>
#define endl "\n"
#define ll long long
#define all(rq) rq.begin(),rq.end()
#define max(a,b) (a<b?b:a)
#define min(a,b) (a<b?a:b)

using namespace std;
const int INF=0x3f3f3f3f;

int main(){
	int n,m;
	cin>>n>>m;
	
	vector<int> v,w,s;
	
	v.resize(1e5+10);
	w.resize(1e5+10);
	s.resize(1e5+10);
	
	int cnt=0;
	for(int i=1;i<=n;i++){
		int v0,w0,s0;
		cin>>v0>>w0>>s0;
		
		for(int k=1;k<=s0;s0-=k,k*=2){ //将多重背包的个数拆分为二进制
			cnt++;
			v[cnt]=v0*k;
			w[cnt]=w0*k;
		}
		
		if(s0>0){
			cnt++;
			v[cnt]=v0*s0;
			w[cnt]=w0*s0;
		}
	}
	
	vector<int> f(m+1);

	for(int i=1;i<=cnt;i++){
		for(int j=m;j>=0;j--){
			if(j>=v[i])
				f[j]=max((f[j-v[i]]+w[i]),f[j]);
			else{
				f[j]=f[j];
			}
		}
	}
	
	cout<<f[m]<<endl;
	return 0;
}